package cn.zebra.dev.sys.module.config.service.impl;

import cn.zebra.dev.ibatis.plus.service.impl.ServiceImpl;
import cn.zebra.dev.ibatis.plus.utils.PageUtils;
import cn.zebra.dev.ibatis.plus.utils.Query;
import cn.zebra.dev.sys.module.config.dao.SysConfigDao;
import cn.zebra.dev.sys.module.config.entity.SysConfigEntity;
import cn.zebra.dev.sys.module.config.service.SysConfigService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 系统配置表
 *
 * @author runnable
 * @date 2019-09-04 10:28:35
 */
@Service
public class SysConfigServiceImpl extends ServiceImpl<SysConfigDao, SysConfigEntity> implements SysConfigService {

    @Override
    public PageUtils<SysConfigEntity> findPage(Map<String, Object> params) {
        QueryWrapper<SysConfigEntity> wrapper = new QueryWrapper<>();
        wrapper.apply("delete_flag = FALSE");
        IPage<SysConfigEntity> page = this.page(
                new Query<SysConfigEntity>(params).getPage(),
                wrapper
        );
        return new PageUtils<>(page);
    }

    @Override
    public SysConfigEntity queryConfig(String key) {
        return queryOrInitConfig(key);
    }

    @Override
    public Boolean updateConfig(Long id, SysConfigEntity entity) {
        entity.setCreateTime(null);
        entity.setDeleteFlag(Boolean.FALSE);
        return update(entity, "id = {0}", id);
    }

    @Override
    public Boolean deleteConfig(Long id) {
        SysConfigEntity entity = new SysConfigEntity();
        entity.setDeleteFlag(Boolean.TRUE);
        return update(entity, "id = {0}", id);
    }

    @Override
    public Boolean saveConfig(SysConfigEntity entity) {
        entity.setDeleteFlag(Boolean.FALSE);
        entity.setCreateTime(LocalDateTime.now());
        return save(entity);
    }

    @Override
    public SysConfigEntity findById(Long id) {
        QueryWrapper<SysConfigEntity> wrapper = new QueryWrapper<>();
        wrapper.apply("id = {0}", id);
        return this.getOne(wrapper);
    }

    private SysConfigEntity queryOrInitConfig(String key) {
        SysConfigEntity configEntity;
        configEntity = selectOne("param_key = {0} and delete_flag = {1}", key, false);
        if (configEntity == null) {
            configEntity = initSaveConfig(key);
        }
        return configEntity;
    }

    private SysConfigEntity initSaveConfig(String key) {
        SysConfigEntity configEntity = new SysConfigEntity();
        configEntity.setParamKey(key);
        configEntity.setParamValue("");
        configEntity.setDeleteFlag(false);
        configEntity.setCreateTime(LocalDateTime.now());
        configEntity.setRemark("");
        if (!save(configEntity)) {
            throw new RuntimeException("查询系统配置失败!该配置无法自动生成!");
        }
        return configEntity;
    }

}
